module Reunion

where

import Asado
import Corte

type Invitado = String

data Reunion = Llega Invitado Reunion | Preparar Asado deriving Show


dameAsado :: Reunion -> Asado
dameAsado (Preparar a) = a
dameAsado (Llega i r) = dameAsado r

agregarUnChori :: Reunion -> Reunion
agregarUnChori (Preparar a) = (Preparar (agregar Chori a))
agregarUnChori (Llega i r) = (Llega i (agregarUnChori(r)))

haySuficienteVacio :: Reunion -> Bool
haySuficienteVacio r = cantidadDeInvitados(r) < 2* (cantDeCorte Vacio (dameAsado(r)))

cantidadDeInvitados :: Reunion -> Int
cantidadDeInvitados (Preparar a) = 0
cantidadDeInvitados (Llega i r) = 1 + cantidadDeInvitados r

ponerEnOrdenElVacio :: Reunion -> Reunion
ponerEnOrdenElVacio r | haySuficienteVacio(r) = limpiarVacio r
                      | otherwise = agregarLoQueFalte r (2* cantidadDeInvitados(r) - (cantDeCorte Vacio (dameAsado(r))))
                        
limpiarVacio :: Reunion -> Reunion
limpiarVacio (Preparar a) = (Preparar (sacar Vacio a))
limpiarVacio (Llega i r) = (Llega i (limpiarVacio(r)))

agregarLoQueFalte :: Reunion -> Int -> Reunion
agregarLoQueFalte (Preparar a) 0 = (Preparar a)
agregarLoQueFalte (Preparar a) x = agregarLoQueFalte (Preparar (agregar Vacio a)) (x-1)
agregarLoQueFalte (Llega i r) x = (Llega i (agregarLoQueFalte r x))


llamanANora :: Reunion -> Bool
llamanANora (Llega "Cabezon" (Llega "Gordo" (Llega "Negro" (Llega "Tito" (Llega "Micho" r))))) = True
llamanANora (LLega i r) = llamanANora r
llamanANora _ = False

 -- aux 
cantDeCorte :: Corte -> Asado -> Int
cantDeCorte c a | (hay c a) = 1 + cantDeCorte c (sacarN 1 c a)
                | otherwise = 0






 






